/**************************************************************************//**
 * @item     CosyOS-II Kernel
 * @file     sv_tick.h
 * @brief    滴答服务
 * @details  仅在 SysTick 中调用并执行，包括在滴答钩子、定时中断钩子、
             定时查询钩子、定时查询事件等处调用。
 * @author   迟凯峰
 * @version  V3.4.0
 * @date     2025.01.06
 ******************************************************************************/

#ifndef __SV_TICK_H
#define __SV_TICK_H

bool       st_clear_delay    (void);
s_ecode_t  st_suspend_task   (s_tasknode_tsp htask);
s_ecode_t  st_resume_task    (s_tasknode_tsp htask);
s_ecode_t  st_delete_task    (s_tasknode_tsp htask);
s_ecode_t  st_set_taskpri    (s_tasknode_tsp htask, s_u8_t npri);
s_ecode_t  st_set_block      (s_tasknode_tsp htask, s_delay_t tick);
s_ecode_t  st_clear_block    (s_tasknode_tsp htask);
bool       st_take_binary    (s_binary_tsp hbin);
bool       st_take_semaphore (s_semaph_tsp hsem);
void       st_give_semaphore (s_semaph_tsp hsem);
m_fetion_t st_recv_fetion    (s_tionbox_tsp htbox);
void      *st_recv_mail      (s_mailbox_tsp hmbox);
void       st_send_mail      (s_mailbox_tsp hmbox, void *mail);
void      *st_recv_msg       (s_queue_tsp hque);
s_ecode_t  st_send_msg       (s_queue_tsp hque, void *msg);

/**
 @addtogroup 滴答服务
 @{
 */

#define sTSV_ClearDelay              st_clear_delay()            /*!< 清除就绪延时 */
#define sTSV_SuspendTask(htask)      st_suspend_task(htask)      /*!< 挂起任务 */
#define sTSV_ResumeTask(htask)       st_resume_task(htask)       /*!< 恢复任务 */
#define sTSV_DeleteTask(htask)       st_delete_task(htask)       /*!< 删除任务 */
#define sTSV_SetTaskPri(htask, npri) st_set_taskpri(htask, npri) /*!< 设置任务优先级 */
#define sTSV_SetBlock(htask, tick)   st_set_block(htask, tick)   /*!< 设置阻塞（时间）*/
#define sTSV_ClearBlock(htask)       st_clear_block(htask)       /*!< 清除阻塞（状态）*/
#define sTSV_TakeBin(bin)            st_take_binary(&bin)        /*!< 获取二值信号量 */
#define sTSV_TakeSem(sem)            st_take_semaphore(&sem)     /*!< 获取计数信号量 */
#define sTSV_GiveSem(sem)            st_give_semaphore(&sem)     /*!< 给予计数信号量 */
#define sTSV_RecvFetion(tbox)        st_recv_fetion(&tbox)       /*!< 接收飞信 */
#define sTSV_RecvMail(mbox)          st_recv_mail(&mbox)         /*!< 接收邮件 */
#define sTSV_SendMail(mbox, mail)    st_send_mail(&mbox, mail)   /*!< 发送邮件 */
#define sTSV_RecvMsg(que)            st_recv_msg((s_queue_tsp)&que) /*!< 接收消息 */
#define sTSV_SendMsg(que, msg)       st_send_msg((s_queue_tsp)&que, msg) /*!< 发送消息 */
#define sTSV_TimInt(tmid, tick)      s_timint_handle[tmid]->timer = s_timint_handle[tmid]->reload = tick /*!< 定时中断 */
#define sTSV_TimQry(tmid, tick)      s_timqry_handle[tmid]->timer = s_timqry_handle[tmid]->reload = tick /*!< 定时查询 */
#define sTSV_GetTime(t)              s_memcpy(t, &s_rtc, sizeof(s_rtc_ts)) /*!< 获取时间 */

/** 设置时间 */
#if SYSCFG_GETRTC_INT == __ENABLED__
#define sTSV_SetTime(t) \
do{ \
	s_memcpy(&s_rtc, t, sizeof(s_rtc_ts)); \
	s_sign_every.set = true; \
	s_update_rtccopy(); \
}while(false)
#else
#define sTSV_SetTime(t) \
do{ \
	s_memcpy(&s_rtc, t, sizeof(s_rtc_ts)); \
	s_sign_every.set = true; \
}while(false)
#endif

/** 发送私信 */
#define sTSV_SendTaskMsg(task) \
	s_sign_send_taskmsg = true; \
	MCUCFG_TASKMSG_PSP; \
	task(MCUCFG_TASKMSG_VAL, 

/** 查询标志组 */
#define sTSV_QueryFlagGroup(group) \
( \
	  sizeof(group) == 1 ? *(s_u8_t  *)&group ? true : false \
	: sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \
	: sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \
	: false \
)

/** 清除标志组 */
#define sTSV_ClearFlagGroup(group) \
do{ \
	sizeof(group) == 1 ? *(s_u8_t  *)&group = false : MCUCFG_TERNARYMASK \
	sizeof(group) == 2 ? *(s_u16_t *)&group = false : MCUCFG_TERNARYMASK \
	sizeof(group) == 4 ? *(s_u32_t *)&group = false : false; \
}while(false)

/** @} */

#endif
